package com.basker.pisces.concurrent.lock;

import java.util.concurrent.TimeUnit;

/**
 * 用于控制并发的锁接口
 *
 * @author hangwen
 */
public interface ILock {

    /**
     * 锁的唯一标识
     *
     * @return
     */
    String getKey();

    /**
     * 当前线程试图加锁，同一时刻只有一个线程能成功加锁,成功获取锁后，需要调用{@link #unlock()}释放锁，如果未能获得锁则立刻返回false
     *
     * @return true 表示获得锁，false 没有获得锁
     */
    boolean lock();

    /**
     * 当前线程试图加锁，同一时刻只有一个线程能成功加锁,成功获取锁后，需要调用{@link #unlock()}释放锁
     *
     * @param waitTime  等待锁的时间，如果超过此时间仍未获得锁，则返回false
     * @param leaseTime 获取锁的持续时间，超过此时间后，其他请求也可以获取锁
     * @param unit      waitTime和leaseTime的时间单位
     * @return
     */
    boolean lock(long waitTime, long leaseTime, TimeUnit unit);

    /**
     * 当前线程试图加锁，同一时刻只有一个线程能成功加锁,成功获取锁后，需要调用{@link #unlock()}释放锁
     *
     * @param waitTime 等待锁的时间，如果超过此时间仍未获得锁，则返回false
     * @param unit     waitTime的时间单位
     * @return true 表示获得锁，false 没有获得锁
     */
    boolean lock(long waitTime, TimeUnit unit);

    /**
     * 释放锁
     *
     * @return true:成功释放锁；false：当前锁被别的线程锁住
     */
    boolean unlock();
}
